package com.sdtv.basemodule.skin;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;

import androidx.core.content.ContextCompat;

import com.blankj.utilcode.util.LogUtils;

import java.io.File;
import java.lang.reflect.Method;

/**
 * 说明：
 * 创建者：Michael
 * 添加时间：2019-10-28
 * 功能描述：操作对象的实例
 * 修改时间:2019-10-28
 */
public class SkinEngine {

    private static volatile SkinEngine instance;

    /**
     * 外部资源管理器
     */
    private Resources mOutResource;
    /**
     * 上下文环境
     */
    private Context mContext;
    /**
     * 资源文件的包名
     */
    private String mOutPkgName;


    /**
     * 设置单例模式 获取操作对象
     *
     * @return
     */
    public static SkinEngine getInstance() {
        if (null == instance) {
            synchronized (SkinEngine.class) {
                if (null == instance) {
                    instance = new SkinEngine();
                }
            }
        }
        return instance;
    }

    /**
     * 初始化上下文环境  使用ApplicationContext
     *
     * @param context
     */
    public void init(Context context) {
        mContext = context.getApplicationContext();
    }

    /**
     * 加载资源文件包
     *
     * @param path 该路径是资源文件的路径 是APK地址
     */
    public void load(String path) {
        if (TextUtils.isEmpty(path)) {
            LogUtils.e("资源文件地址为空....");
            return;
        }
        File file = new File(path);
        if (!file.exists()) {
            LogUtils.e("资源文件不存在...");
            return;
        }
        //取得PackageManager引用
        PackageManager packageManager = mContext.getPackageManager();
        //  外界传入了一个apk的文件路径，这个方法，拿到这个apk的包信息
        PackageInfo packageInfo = packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
        // 应用名称
        mOutPkgName = packageInfo.packageName;
        //资源管理器
        AssetManager assetManager;
        try {
            // 通过反射获取AssetManager 用来加载外面的资源包
            assetManager = AssetManager.class.newInstance();
            //  使用反射，是因为他这个类内部的addAssetPath方法是hide状态
            Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
            //反射执行方法
            addAssetPath.invoke(assetManager, path);
            //得到外部资源文件包，它的存在，就是要让我们的app有能力加载外
            mOutResource = new Resources(assetManager,
                    mContext.getResources().getDisplayMetrics(),
                    mContext.getResources().getConfiguration());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 提供外部资源包里面的颜色
     *
     * @param resId
     * @return
     */
    public int getColor(int resId) {
        if (mOutResource == null) {
            return resId;
        }
        String resName = mOutResource.getResourceEntryName(resId);
        int outResId = mOutResource.getIdentifier(resName, "color", mOutPkgName);
        if (outResId == 0) {
            return resId;
        }
        return mOutResource.getColor(outResId);
    }

    /**
     * 提供外部资源包里的图片资源
     *
     * @param resId
     * @return
     */
    public Drawable getDrawable(int resId) {//获取图片
        if (mOutResource == null) {
            return ContextCompat.getDrawable(mContext, resId);
        }
        String resName = mOutResource.getResourceEntryName(resId);
        int outResId = mOutResource.getIdentifier(resName, "drawable", mOutPkgName);
        if (outResId == 0) {
            return ContextCompat.getDrawable(mContext, resId);
        }
        return mOutResource.getDrawable(outResId);
    }


}
